package com.utils;

import java.lang.ref.SoftReference;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.widget.TextView;

public class LogUtil {

    private static SoftReference<TextView> tv;
    private static Handler handler = null;

    private static final int LOG_VERBOSE = 0;
    private static final int LOG_DEBUG = 1;
    private static final int LOG_INFO = 2;
    private static final int LOG_WARN = 3;
    private static final int LOG_ERROR = 4;
    private static final int LOG_ASSERT = 5;

    private static final int CLR_VERBOSE = Color.BLACK;
    private static final int CLR_DEBUG = Color.BLACK;
    private static final int CLR_INFO = Color.GREEN;
    private static final int CLR_WARN = Color.CYAN;
    private static final int CLR_ERROR = Color.RED;
    private static final int CLR_ASSERT = Color.RED;

    public static SoftReference<TextView> getTv() {
        return tv;
    }

    public static void setTv(TextView tv) {
        if (tv != null) {
            LogUtil.tv = new SoftReference<TextView>(tv);
            handler = new Handler() {

                @Override
                public void handleMessage(Message msg) {
                    if (LogUtil.tv != null && LogUtil.tv.get() != null) {
                        TextView textView = LogUtil.tv.get();

                        int color = CLR_VERBOSE;

                        if (msg.arg1 == LOG_VERBOSE) {
                        } else if (msg.arg1 == LOG_DEBUG) {
                            color = CLR_DEBUG;
                        } else if (msg.arg1 == LOG_INFO) {
                            color = CLR_INFO;
                        } else if (msg.arg1 == LOG_WARN) {
                            color = CLR_WARN;
                        } else if (msg.arg1 == LOG_ERROR) {
                            color = CLR_ERROR;
                        } else if (msg.arg1 == LOG_ASSERT) {
                            color = CLR_ASSERT;
                        }

                        SpannableString ss = new SpannableString("\n" + msg.obj);
                        ss.setSpan(new ForegroundColorSpan(color), 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                        textView.append(ss);
                    }
                }
            };
        } else {
            handler = null;
            LogUtil.tv = null;
        }
    }

    public static void d(String TAG, String log) {
        if (logUI(TAG, LOG_DEBUG, log)) {
            return;
        }
        Log.d(TAG, log);
    }

    public static void i(String TAG, String log) {
        if (logUI(TAG, LOG_INFO, log)) {
            return;
        }
        Log.i(TAG, log);
    }

    public static void w(String tag, String log) {
        if (logUI(tag, LOG_WARN, log)) {
            return;
        }
        Log.w(tag, log);
    }

    public static void e(String TAG, String log) {
        if (logUI(TAG, LOG_ERROR, log)) {
            return;
        }

        Log.e(TAG, log);
    }

    /*
     * 
     * 字母 日期或时间元素 表示
     * G Era 标志符 Text
     * y 年 Year
     * M 年中的月份 Month
     * w 年中的周数 Number
     * W 月份中的周数 Number
     * D 年中的天数 Number
     * d 月份中的天数 Number
     * F 月份中的星期 Number
     * E 星期中的天数 Text
     * a Am/pm 标记 Text
     * H 一天中的小时数（0-23） Number
     * k> 一天中的小时数（1-24） Number
     * K am/pm 中的小时数（0-11） Number
     * h am/pm 中的小时数（1-12） Number
     * m 小时中的分钟数 Number
     * s 分钟中的秒数 Number
     * S 毫秒数 Number
     * z 时区 General time zone
     * Z 时区 RFC 822 time zone
     */
    private static boolean logUI(String tag, int level, String log) {
        if (tv != null && tv.get() != null) {
            SimpleDateFormat myFormat = new SimpleDateFormat("mm:ss SSS", Locale.getDefault());
            String dateStr = myFormat.format(new Date());
            String newlog = dateStr + " " + tag + " " + log;
            Message msg = handler.obtainMessage(1, newlog);
            msg.arg1 = level;
            handler.sendMessage(msg);
            return true;
        }

        return false;
    }
}
